home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / developer-tools / guis / iedit / expanders / scrollerwindow.desc < prev    next >
Encoding:
Text File  |  1996-03-10  |  18.1 KB  |  592 lines

  1. ##RENDPRI
  2. -20
  3. ##HEADER
  4.  
  5. #ifndef IM
  6. #define IM(o) ((struct Image *) o)
  7. #endif
  8.  
  9. #ifndef GAD
  10. #define GAD(o) ((struct Gadget *) o)
  11. #endif
  12.  
  13. #ifndef MAX
  14. #define MAX(x,y) ((x) > (y) ? (x) : (y))
  15. #endif
  16.  
  17. #ifndef MIN
  18. #define MIN(x,y) ((x) < (y) ? (x) : (y))
  19. #endif
  20.  
  21. /* DICE specific */
  22. #define HOOK __geta4
  23. #define A0(stuff) __A0 stuff
  24. #define A1(stuff) __A1 stuff
  25. #define A2(stuff) __A2 stuff
  26.  
  27. #define HORIZ_GID       1
  28. #define VERT_GID        2
  29. #define LEFT_GID        3
  30. #define RIGHT_GID       4
  31. #define UP_GID          5
  32. #define DOWN_GID        6
  33.  
  34. extern int SysISize( void );
  35. extern Object *NewImageObject( ULONG );
  36. extern Object *NewPropObject( ULONG, Tag, ... );
  37. extern Object *NewButtonObject( Object *, Tag, ... );
  38. extern void NotifyAttrChanges( Object *, struct GadgetInfo *, ULONG, Tag, ... );
  39. extern ULONG HandleMyButton( struct Gadget *, struct gpInput *, struct ButtonData * );
  40. extern HOOK ULONG DispatchMyButtongClass( A0(Class *), A2(Object *), A1(struct gpInput *));
  41. extern HOOK ULONG DispatchMyPropgClass(A0(Class *), A2(Object *), A1(struct gpLayout *));
  42. extern void UpdateProp( struct Window *, Object *, ULONG, LONG );
  43. extern HOOK ULONG BFHookFunc( void );
  44.  
  45. extern struct Library           *UtilityBase;
  46. extern struct DrawInfo          *dri;
  47. extern Class                    *mypropgclass;
  48. extern Class                    *mybuttongclass;
  49. extern Object                   *SizeImage, *LeftImage, *RightImage;
  50. extern Object                   *UpImage, *DownImage;
  51.  
  52. ##SUPPORT
  53.  
  54. int SysISize( void )
  55. {
  56.         return(( Scr->Flags & SCREENHIRES ) ? SYSISIZE_MEDRES : SYSISIZE_LOWRES );
  57. }
  58.  
  59.  
  60. Object *NewImageObject( ULONG which )
  61. {
  62.         return( NewObject( NULL, SYSICLASS,
  63.                            SYSIA_DrawInfo, dri,
  64.                            SYSIA_Which, which,
  65.                            SYSIA_Size, SysISize(),
  66.                            TAG_DONE ));
  67. }
  68.  
  69. Object *NewPropObject( ULONG freedom, Tag tag1, ... )
  70. {
  71.         return( NewObject( mypropgclass, NULL,
  72.                            ICA_TARGET, ICTARGET_IDCMP,
  73.                            PGA_Freedom, freedom,
  74.                            PGA_NewLook, TRUE,
  75.                            PGA_Borderless, (( dri->dri_Flags & DRIF_NEWLOOK ) && ( dri->dri_Depth != 1 )),
  76.                            TAG_MORE, &tag1 ));
  77. }
  78.  
  79. Object *NewButtonObject( Object *image, Tag tag1, ... )
  80. {
  81.         return( NewObject( mybuttongclass, NULL,
  82.                            ICA_TARGET, ICTARGET_IDCMP,
  83.                            GA_Image, image,
  84.                            TAG_MORE, &tag1 ));
  85. }
  86.  
  87. struct ButtonData
  88. {
  89.         ULONG   TickCounter;
  90. };
  91.  
  92. struct PropData
  93. {
  94.         LONG   *Visible;
  95. };
  96.  
  97. void NotifyAttrChanges( Object *o, struct GadgetInfo *gi, ULONG flags, Tag attr1, ... )
  98. {
  99.         DoMethod( o, OM_NOTIFY, &attr1, gi, flags );
  100. }
  101.  
  102. ULONG HandleMyButton( struct Gadget *gad, struct gpInput *gpi, struct ButtonData *bd )
  103. {
  104.         UWORD            selected = 0;
  105.         struct RastPort *rp;
  106.         ULONG            retval = GMR_MEACTIVE;
  107.  
  108.         if (PointInImage((gpi->gpi_Mouse.X << 16) + (gpi->gpi_Mouse.Y), gad->GadgetRender))
  109.         {
  110.                 selected = GFLG_SELECTED;
  111.         }
  112.         if (gpi->gpi_IEvent->ie_Class == IECLASS_RAWMOUSE && gpi->gpi_IEvent->ie_Code == SELECTUP)
  113.         {
  114.                 retval = GMR_NOREUSE;
  115.                 selected = 0;
  116.         }
  117.         if (gpi->gpi_IEvent->ie_Class == IECLASS_TIMER)
  118.         {
  119.                 if (selected && !(--bd->TickCounter))
  120.                 {
  121.                         bd->TickCounter = 1;
  122.                         NotifyAttrChanges( (Object *) gad, gpi->gpi_GInfo, 0,
  123.                                            GA_ID, gad->GadgetID,
  124.                                            TAG_DONE);
  125.                 }
  126.         }
  127.         if ((gad->Flags & GFLG_SELECTED) != selected)
  128.         {
  129.                 gad->Flags ^= GFLG_SELECTED;
  130.                 if (rp = ObtainGIRPort(gpi->gpi_GInfo))
  131.                 {
  132.                         DoMethod((Object *) gad, GM_RENDER, gpi->gpi_GInfo, rp, GREDRAW_UPDATE);
  133.                         ReleaseGIRPort(rp);
  134.                 }
  135.         }
  136.         return (retval);
  137. }
  138.  
  139. HOOK ULONG DispatchMyButtongClass( A0(Class *cl), A2(Object *o), A1(struct gpInput *gpi))
  140. {
  141.         struct ButtonData *bd = (struct ButtonData *) INST_DATA(cl, o);
  142.  
  143.         switch (gpi->MethodID)
  144.         {
  145.         case GM_GOACTIVE:
  146.                 bd->TickCounter = 2;
  147.                 NotifyAttrChanges( o, gpi->gpi_GInfo, 0,
  148.                                    GA_ID, GAD(o)->GadgetID,
  149.                                    TAG_DONE );
  150.                 return (GMR_MEACTIVE);
  151.         case GM_HANDLEINPUT:
  152.                 return (HandleMyButton(GAD(o), gpi, bd));
  153.         default:
  154.                 return( DoSuperMethodA( cl, o, ( Msg ) gpi ));
  155.         }
  156. }
  157.  
  158.  
  159. #define RecalcHVisible(window) (window->GZZWidth)
  160. #define RecalcVVisible(window) (window->GZZHeight)
  161.  
  162. HOOK ULONG DispatchMyPropgClass(A0(Class *cl), A2(Object *o), A1(struct gpLayout *gpl))
  163. {
  164.         if (gpl->MethodID == GM_LAYOUT)
  165.         {
  166.                 struct Window      *win = gpl->gpl_GInfo->gi_Window;
  167.                 struct PropInfo    *pi = (struct PropInfo *)GAD(o)->SpecialInfo;
  168.                 LONG                visible;
  169.                 struct PropData    *pd = (struct PropData *)INST_DATA( cl, o );
  170.  
  171.                 if (pi->Flags & FREEHORIZ)
  172.                 {
  173.                         visible = RecalcHVisible( win );
  174.                 }
  175.                 else
  176.                 {
  177.                         visible = RecalcVVisible( win );
  178.                 }
  179.  
  180.                 *pd->Visible = visible;
  181.  
  182.                 SetAttrs( o, PGA_Visible, visible, TAG_DONE );
  183.         }
  184.  
  185.         return ( DoSuperMethodA( cl, o, (Msg) gpl ));
  186. }
  187.  
  188. void UpdateProp( struct Window *window, Object *gadget, ULONG attr, LONG value)
  189. {
  190.         if (SetAttrs(gadget, attr, value, TAG_DONE))
  191.         {
  192.                 struct PropInfo *pi = (struct PropInfo *) (GAD(gadget))->SpecialInfo;
  193.                 NewModifyProp(GAD(gadget), window, NULL, pi->Flags, pi->HorizPot, pi->VertPot, pi->HorizBody, pi->VertBody, 1);
  194.         }
  195. }
  196.  
  197.  
  198. HOOK ULONG BFHookFunc( void )
  199. {
  200.         return (1);
  201. }
  202.  
  203. static struct Hook BFHook =
  204. {
  205.         NULL, NULL,
  206.         BFHookFunc,
  207. };
  208.  
  209. #define QUAL_SHIFT      (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  210. #define QUAL_ALT        (IEQUALIFIER_LALT | IEQUALIFIER_RALT)
  211. #define QUAL_CTRL       (IEQUALIFIER_CONTROL)
  212.  
  213. ##SETUP
  214.  
  215.         if(!( dri = GetScreenDrawInfo( Scr )))
  216.             return( 3L );
  217.  
  218.         SizeImage   = NewImageObject( SIZEIMAGE  );
  219.         LeftImage   = NewImageObject( LEFTIMAGE  );
  220.         RightImage  = NewImageObject( RIGHTIMAGE );
  221.         UpImage     = NewImageObject( UPIMAGE    );
  222.         DownImage   = NewImageObject( DOWNIMAGE  );
  223.  
  224.         if(!( SizeImage && LeftImage && RightImage && UpImage && DownImage ))
  225.             return( 4L );
  226.  
  227.         if(!( mypropgclass = MakeClass( NULL, PROPGCLASS, NULL, sizeof( struct PropData ), 0 )))
  228.             return( 5L );
  229.  
  230.         mypropgclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyPropgClass;
  231.  
  232.         if(!( mybuttongclass = MakeClass( NULL, BUTTONGCLASS, NULL, sizeof( struct ButtonData ), 0 )))
  233.             return( 5L );
  234.  
  235.         mybuttongclass->cl_Dispatcher.h_Entry = ( ULONG (*)()) DispatchMyButtongClass;
  236.  
  237. ##CLOSEDOWN
  238.  
  239.         DisposeObject( SizeImage );
  240.         DisposeObject( LeftImage );
  241.         DisposeObject( RightImage );
  242.         DisposeObject( UpImage );
  243.         DisposeObject( DownImage );
  244.  
  245.         FreeScreenDrawInfo( Scr, dri );
  246.  
  247.         if( mybuttongclass )
  248.                 FreeClass( mybuttongclass );
  249.  
  250.         if( mypropgclass )
  251.                 FreeClass( mypropgclass );
  252.  
  253. ##INCLUDE
  254. #ifndef EXEC_EXECBASE_H
  255. #include <exec/execbase.h>
  256. #endif
  257. #ifndef EXEC_LIBRARIES_H
  258. #include <exec/libraries.h>
  259. #endif
  260. #ifndef INTUITION_ICCLASS_H
  261. #include <intuition/icclass.h>
  262. #endif
  263. #ifndef INTUITION_CLASSUSR_H
  264. #include <intuition/classusr.h>
  265. #endif
  266. #ifndef INTUITION_IMAGECLASS_H
  267. #include <intuition/imageclass.h>
  268. #endif
  269. #ifndef CLIB_ALIB_PROTOS_H
  270. #include <clib/alib_protos.h>
  271. #endif
  272. #ifndef CLIB_UTILITY_PROTOS_H
  273. #include <clib/utility_protos.h>
  274. #endif
  275. #ifdef PRAGMAS
  276.   #ifndef PRAGMAS_UTILITY_PRAGMAS
  277.   #include <pragmas/utility_pragmas.h>
  278.   #endif
  279. #endif
  280.  
  281.  
  282. ##GLOBAL
  283. struct DrawInfo         *dri;
  284. Class                   *mypropgclass;
  285. Class                   *mybuttongclass;
  286. Object                  *SizeImage, *LeftImage, *RightImage;
  287. Object                  *UpImage, *DownImage;
  288.  
  289. ##DATA
  290. struct BitMap           *%wBitMap;
  291.  
  292. BOOL                    %wFrozen = FALSE;
  293. Object                  *%wHorizGadget, *%wVertGadget;
  294. Object                  *%wLeftGadget, *%wRightGadget;
  295. Object                  *%wUpGadget, *%wDownGadget;
  296.  
  297. LONG                    %wHTotal, %wVTotal;
  298. LONG                    %wHVisible, %wVVisible;
  299.  
  300. ##OPENWND
  301.  
  302. LONG Open%wWindow( void )
  303. {
  304.         int resolution = SysISize();
  305.         WORD topborder = YOffset + 1;
  306.         WORD w = IM( SizeImage )->Width;
  307.         WORD h = IM( SizeImage )->Height;
  308.         WORD bw = ( resolution == SYSISIZE_LOWRES ) ? 1 : 2;
  309.         WORD bh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  310.         WORD rw = ( resolution == SYSISIZE_HIRES  ) ? 3 : 2;
  311.         WORD rh = ( resolution == SYSISIZE_HIRES  ) ? 2 : 1;
  312.         WORD gw, gh;
  313.         struct PropData *pd;
  314.  
  315.         gh = MAX( IM( LeftImage  )->Height, h  );
  316.         gh = MAX( IM( RightImage )->Height, gh );
  317.         gw = MAX( IM( UpImage    )->Width,  w  );
  318.         gw = MAX( IM( DownImage  )->Width,  gw );
  319.  
  320.         if(!( %wHorizGadget = NewPropObject( FREEHORIZ,
  321.                               GA_Left, rw + 1,
  322.                               GA_RelBottom, bh - gh + 2,
  323.                               GA_RelWidth, -gw - 1 - IM( LeftImage )->Width - IM( RightImage )->Width - rw - rw,
  324.                               GA_Height, gh - bh - bh - 2,
  325.                               GA_BottomBorder, TRUE,
  326.                               GA_ID, HORIZ_GID,
  327.                               PGA_Total, %wHTotal,
  328.                               PGA_Visible, %wHVisible,
  329.                               TAG_DONE )))
  330.             return( 2L );
  331.  
  332.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wHorizGadget );
  333.         pd->Visible = &%wHVisible;
  334.  
  335.         if(!( %wVertGadget = NewPropObject( FREEVERT,
  336.                              GA_RelRight, bw - gw + 3,
  337.                              GA_Top, topborder + rh,
  338.                              GA_Width, gw - bw - bw - 4,
  339.                              GA_RelHeight, -topborder - h - IM( UpImage )->Height - IM( DownImage )->Height - rh - rh,
  340.                              GA_RightBorder, TRUE,
  341.                              GA_Previous, %wHorizGadget,
  342.                              GA_ID, VERT_GID,
  343.                              PGA_Total, %wVTotal,
  344.                              PGA_Visible, %wVVisible,
  345.                              TAG_DONE )))
  346.             return( 2L );
  347.  
  348.         pd = ( struct PropData * )INST_DATA( mypropgclass, %wVertGadget );
  349.         pd->Visible = &%wVVisible;
  350.  
  351.         if(!( %wLeftGadget = NewButtonObject( LeftImage,
  352.                              GA_RelRight, 1 - IM( LeftImage )->Width - IM( RightImage )->Width - gw,
  353.                              GA_RelBottom, 1 - IM( LeftImage )->Height,
  354.                              GA_BottomBorder, TRUE,
  355.                              GA_Previous, %wVertGadget,
  356.                              GA_ID, LEFT_GID,
  357.                              TAG_DONE )))
  358.             return( 2L );
  359.  
  360.         if(!( %wRightGadget = NewButtonObject( RightImage,
  361.                               GA_RelRight, 1 - IM( RightImage )->Width - gw,
  362.                               GA_RelBottom, 1 - IM( RightImage )->Height,
  363.                               GA_BottomBorder, TRUE,
  364.                               GA_Previous, %wLeftGadget,
  365.                               GA_ID, RIGHT_GID,
  366.                               TAG_DONE )))
  367.             return( 2L );
  368.  
  369.         if(!( %wUpGadget = NewButtonObject( UpImage,
  370.                            GA_RelRight, 1 - IM( UpImage )->Width,
  371.                            GA_RelBottom, 1 - IM( UpImage )->Height - IM( DownImage )->Height - h,
  372.                            GA_RightBorder, TRUE,
  373.                            GA_Previous, %wRightGadget,
  374.                            GA_ID, UP_GID,
  375.                            TAG_DONE )))
  376.             return( 2L );
  377.  
  378.         if(!( %wDownGadget = NewButtonObject( DownImage,
  379.                              GA_RelRight, 1 - IM( DownImage )->Width,
  380.                              GA_RelBottom, 1 - IM( DownImage )->Height - h,
  381.                              GA_RightBorder, TRUE,
  382.                              GA_Previous, %wUpGadget,
  383.                              GA_ID, DOWN_GID,
  384.                              TAG_DONE )))
  385.             return( 2L );
  386.  
  387. ##OPENWND-MENUS
  388.  
  389.         if(!( %wMenus = CreateMenus( %wNewMenu, TAG_END )))
  390.                 return( 5L );
  391.  
  392.         LayoutMenus( %wMenus, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_END );
  393.  
  394. ##OPENWND-2
  395.  
  396.         %wWTags[4].ti_Data = MAX( 80, gw + 1 + IM(LeftImage)->Width + IM(RightImage)->Width + rw + rw + KNOBHMIN );
  397.         %wWTags[6].ti_Data = MAX(50, topborder + h + IM(UpImage)->Height + IM(DownImage)->Height + rh + rh + KNOBVMIN);
  398.         %wWTags[8].ti_Data = Scr;
  399.  
  400.         if(!( %wWnd = OpenWindowTags( NULL,
  401.                                       WA_Gadgets, %wHorizGadget,
  402.                                       WA_BackFill, &BFHook,
  403.                                       TAG_MORE, %wWTags )))
  404.             return( 4L );
  405.  
  406. ##OPENWND-MENUS-2
  407.  
  408.         SetMenuStrip( %wWnd, %wMenus );
  409.  
  410. ##OPENWND-END
  411.  
  412.         Update%wSWindow();
  413.  
  414.         return( 0L );
  415. }
  416.  
  417. void Update%wBitMap( void )
  418. {
  419.         ULONG srcx, srcy;
  420.  
  421.         if (!%wFrozen) {
  422.                 GetAttr(PGA_Top, %wHorizGadget, &srcx);
  423.                 GetAttr(PGA_Top, %wVertGadget, &srcy);
  424.                 BltBitMapRastPort( %wBitMap, srcx, srcy, %wWnd->RPort, %wWnd->BorderLeft, %wWnd->BorderTop, MIN( %wHTotal, %wHVisible ), MIN( %wVTotal, %wVVisible), 0xC0 );
  425.         }
  426. }
  427.  
  428. void Update%wSWindow( void )
  429. {
  430.         if( SysBase->LibNode.lib_Version < 39 ) {
  431.                 %wHVisible = RecalcHVisible( %wWnd );
  432.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Visible, %wHVisible );
  433.                 %wVVisible = RecalcVVisible( %wWnd );
  434.                 UpdateProp( %wWnd, %wVertGadget, PGA_Visible, %wVVisible );
  435.         }
  436.         Update%wBitMap();
  437. }
  438.  
  439. void %wScrollerLeft(LONG amount)
  440. {
  441.         LONG oldtop;
  442.  
  443.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  444.         if (oldtop > 0)
  445.         {
  446.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MAX(0, oldtop - amount));
  447.                 Update%wBitMap();
  448.         }
  449. }
  450.  
  451. void %wScrollerRight(LONG amount)
  452. {
  453.         LONG oldtop;
  454.  
  455.         GetAttr(PGA_Top, %wHorizGadget, (ULONG *) &oldtop);
  456.         if (oldtop < %wHTotal - %wHVisible)
  457.         {
  458.                 UpdateProp( %wWnd, %wHorizGadget, PGA_Top, MIN( %wHTotal - %wHVisible, oldtop + amount));
  459.                 Update%wBitMap();
  460.         }
  461. }
  462.  
  463. void %wScrollerUp(LONG amount)
  464. {
  465.         LONG oldtop;
  466.  
  467.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  468.         if (oldtop > 0)
  469.         {
  470.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MAX(0, oldtop - amount));
  471.                 Update%wBitMap();
  472.         }
  473. }
  474.  
  475. void %wScrollerDown(LONG amount)
  476. {
  477.         LONG oldtop;
  478.  
  479.         GetAttr(PGA_Top, %wVertGadget, (ULONG *) &oldtop);
  480.         if (oldtop < %wVTotal - %wVVisible)
  481.         {
  482.                 UpdateProp( %wWnd, %wVertGadget, PGA_Top, MIN( %wVTotal - %wVVisible, oldtop + amount));
  483.                 Update%wBitMap();
  484.         }
  485. }
  486.  
  487. BOOL %wRawKey( void )
  488. {
  489.         switch( %wMsg.Code )
  490.         {
  491.         case CURSORLEFT:
  492.                 if( %wMsg.Qualifier & QUAL_CTRL ) %wScrollerLeft( %wHTotal );
  493.                 else if( %wMsg.Qualifier & QUAL_SHIFT) %wScrollerLeft( %wHVisible - 1 );
  494.                 else if( %wMsg.Qualifier & QUAL_ALT) %wScrollerLeft( 16 );
  495.                 else %wScrollerLeft( 1 );
  496.                 break;
  497.         case CURSORRIGHT:
  498.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerRight( %wHTotal);
  499.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerRight( %wHVisible - 1);
  500.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerRight( 16 );
  501.                 else %wScrollerRight( 1 );
  502.                 break;
  503.         case CURSORUP:
  504.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerUp( %wVTotal );
  505.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerUp( %wVVisible - 1 );
  506.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerUp( 16 );
  507.                 else %wScrollerUp( 1 );
  508.                 break;
  509.         case CURSORDOWN:
  510.                 if (%wMsg.Qualifier & QUAL_CTRL) %wScrollerDown( %wVTotal);
  511.                 else if (%wMsg.Qualifier & QUAL_SHIFT) %wScrollerDown( %wVVisible - 1);
  512.                 else if (%wMsg.Qualifier & QUAL_ALT) %wScrollerDown( 16 );
  513.                 else %wScrollerDown( 1 );
  514.                 break;
  515.         }
  516.  
  517.         return( TRUE );
  518. }
  519.  
  520. BOOL %wIDCMPUpdate( void )
  521. {
  522.         struct TagItem *attrs = (struct TagItem *)%wMsg.IAddress;
  523.  
  524.         switch (GetTagData(GA_ID, 0, attrs))
  525.         {
  526.         case HORIZ_GID:
  527.         case VERT_GID:
  528.                 Update%wBitMap();
  529.                 break;
  530.         case LEFT_GID:
  531.                 %wScrollerLeft( 1 );
  532.                 break;
  533.         case RIGHT_GID:
  534.                 %wScrollerRight( 1 );
  535.                 break;
  536.         case UP_GID:
  537.                 %wScrollerUp( 1 );
  538.                 break;
  539.         case DOWN_GID:
  540.                 %wScrollerDown( 1 );
  541.                 break;
  542.         }
  543.  
  544.         return( TRUE );
  545. }
  546.  
  547. BOOL %wSizeVerify( void )
  548. {
  549.         %wFrozen = TRUE;
  550.         return( TRUE );
  551. }
  552.  
  553. BOOL %wNewSize( void )
  554. {
  555.         %wFrozen = FALSE;
  556.         Update%wSWindow();
  557.         return( TRUE );
  558. }
  559.  
  560.  
  561. ##CLOSEWND
  562.  
  563.         DisposeObject( %wHorizGadget );
  564.         DisposeObject( %wVertGadget );
  565.         DisposeObject( %wLeftGadget );
  566.         DisposeObject( %wRightGadget );
  567.         DisposeObject( %wUpGadget );
  568.         DisposeObject( %wDownGadget );
  569.  
  570.         %wHorizGadget = NULL;
  571.         %wVertGadget  = NULL;
  572.         %wLeftGadget  = NULL;
  573.         %wRightGadget = NULL;
  574.         %wUpGadget    = NULL;
  575.         %wDownGadget  = NULL;
  576.  
  577. ##EXTERN
  578. extern struct BitMap *%wBitMap;
  579. extern LONG %wHTotal, %wVTotal, %wHVisible, %wVVisible;
  580. extern void Update%wBitMap( void );
  581. extern void Update%wSWindow( void );
  582. extern void %wScrollerLeft( LONG );
  583. extern void %wScrollerRight( LONG );
  584. extern void %wScrollerUp( LONG );
  585. extern void %wScrollerDown( LONG );
  586.  
  587. ##RENDER
  588.  
  589.         Update%wBitMap();
  590.  
  591. ##end
  592.